package model;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class ProjetoDAO 
{
	public void incluir(Projeto projeto) throws SQLException 
	{
		Statement comando = DBConnection.getInstancia().conn.createStatement();
		String query = "INSERT INTO projeto VALUES ('" + projeto.getReferencia() + "', '" + projeto.getTitulo() + "', " + Integer.toString(projeto.getAno()) + ", '" + projeto.getCliente().getCnpj() + "')";
		comando.executeUpdate(query);
	}

	public void alterar(Projeto projeto) throws SQLException
	{
		Statement comando = DBConnection.getInstancia().conn.createStatement();
		String query = "UPDATE projeto";
		query += " SET titulo = '" + projeto.getTitulo() + "', ano = '" + Integer.toString(projeto.getAno()) + "', cnpj = '" + projeto.getCliente().getCnpj() + "'";
		query += " WHERE lower(referencia) = lower('" + projeto.getReferencia() + "')";
		comando.executeUpdate(query);
	}

	public boolean excluir(Projeto projeto) throws SQLException 
	{
		Statement comando = DBConnection.getInstancia().conn.createStatement();
		boolean retorno = true;
		int qtdDependentes = 0;
		String query = "";
		ResultSet rs;
		query = "SELECT COUNT(*) as projetos FROM bem_projeto WHERE referencia = '" + projeto.getReferencia() + "'";
		rs = comando.executeQuery(query);
		if (rs.next())
			qtdDependentes += rs.getInt("projetos");

		query = "SELECT COUNT(*) as projetos FROM contrato WHERE referencia = '" + projeto.getReferencia() + "'";
		rs = comando.executeQuery(query);
		if (rs.next())
			qtdDependentes += rs.getInt("projetos");

		if (qtdDependentes > 0)
			retorno = false;
		else
		{
			query = "DELETE FROM projeto WHERE referencia = '" + projeto.getReferencia() + "'";
			comando.executeUpdate(query);
		}
		return retorno;
	}

	public ArrayList<Projeto> consultar(Projeto projeto, boolean pelaReferencia) throws SQLException
	{
		Statement comando = DBConnection.getInstancia().conn.createStatement();
		ArrayList<Projeto> retorno = new ArrayList<Projeto>();
		ResultSet rs;
		try
		{
			ClienteDAO objCDAO = new ClienteDAO();
			String query = "SELECT * FROM projeto WHERE 1 = 1";
			if (pelaReferencia)
			{
				query += " AND lower(referencia) LIKE lower('%" + projeto.getReferencia() + "%')";
			}
			else
			{
				if (projeto != null)
				{
					if (projeto.getAno() != 0)
						query += " AND ano = " + Integer.toString(projeto.getAno());
					if (!(null == projeto.getCliente().getCnpj()))
						query += " AND cnpj LIKE '%" + projeto.getCliente().getCnpj() + "%'";
					if (!(null == projeto.getReferencia() || projeto.getReferencia().equals("")))
						query += " AND lower(referencia) LIKE lower('%" + projeto.getReferencia() + "%')";
					if (!(null == projeto.getTitulo() || projeto.getTitulo().equals("")))
						query += " AND lower(titulo) LIKE lower('%" + projeto.getTitulo() + "%')";
				}
			}
			query += " ORDER BY titulo";
			rs = comando.executeQuery(query);
			while (rs.next())
			{
				Projeto p = new Projeto();
				ArrayList<Cliente> cliente = objCDAO.consultar((new Cliente(rs.getString("cnpj"))), true);
				p.setAno(rs.getInt("ano"));
				p.setReferencia(rs.getString("referencia"));
				p.setTitulo(rs.getString("titulo"));
				if (cliente.size() == 0)
					p.setCliente(null);
				else
					p.setCliente(cliente.get(0));
				retorno.add(p);
			}
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
		return retorno;
	}

	public ArrayList<Projeto> consultar(Projeto projeto)
			throws SQLException {
		Statement comando = DBConnection.getInstancia().conn.createStatement();
		ArrayList<Projeto> retorno = new ArrayList<Projeto>();
		ResultSet rs;
		try {
			String query = "SELECT * FROM projeto WHERE 1=1";
			if (!(null == projeto.getReferencia()))
				query += " AND referencia = '" + projeto.getReferencia() + "'";
			rs = comando.executeQuery(query);
			while (rs.next()) {
				Projeto p = new Projeto();
				p.setReferencia(rs.getString("referencia"));
				p.setTitulo(rs.getString("titulo"));
				// Pegar cliente
				ArrayList<Cliente> c = new ArrayList<Cliente>();
				c = new ClienteDAO().consultar(new Cliente(rs.getString("cnpj")),true);
				p.setCliente(c.get(0));
				// Pegar os bens
				p.setBens(new BemDAO().consultar());
				retorno.add(p);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return retorno;
	}
}